package minuy.android.jsdj2020.view;


import android.graphics.Color;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.ValueFormatter;

import java.util.ArrayList;
import java.util.List;

public class ChartViewTool {

    private LineChart lineChart; // 数据控件
    private List<Entry> entryList; //x数据
    private List<Float> floatList; //y数据
    private LineData lineData; //线数据
    private LineDataSet lineDataSet; //线


    public ChartViewTool(LineChart lineChart,String name,int color){
        this.lineChart = lineChart;
        entryList = new ArrayList<>();
        floatList = new ArrayList<>();
        lineData = new LineData();

        lineDataSet = new LineDataSet(entryList, name);

        lineChart.setData(lineData);
        setChartBasicAttr(lineChart);

        createLine(floatList, entryList, lineDataSet, color, lineData, lineChart);
        lineChart.getLineData().getDataSets().get(0).setVisible(false);
        showLine(lineChart,0);
    }

    public void addEntry(float data){
        addEntry(lineDataSet, lineData, lineChart, data, 0);
    }

    /**
     * 功能：设置图表的基本属性
     */
    private void setChartBasicAttr(LineChart lineChart) {
        /***图表设置***/
        lineChart.setDrawGridBackground(false); //是否展示网格线
        lineChart.setDrawBorders(true); //是否显示边界
        lineChart.setDragEnabled(true); //是否可以拖动
        lineChart.setScaleEnabled(true); // 是否可以缩放
        lineChart.setTouchEnabled(true); //是否有触摸事件
        //设置XY轴动画效果
        //lineChart.animateY(2500);
        //lineChart.animateX(1500);
        //设置14个点以上不显示数值
        //lineChart.setMaxVisibleValueCount(100);

        //隐藏描述
        lineChart.getDescription().setEnabled(false);
    }

    /**
     * 动态添加数据
     * 在一个LineChart中存放的折线，其实是以索引从0开始编号的
     *
     * @param yValues y值
     */
    private void addEntry(LineDataSet lineDataSet, LineData lineData, LineChart lineChart, float yValues, int index) {
        Entry entry;
        /*
        // 通过索引得到一条折线，之后得到折线上当前点的数量

        int xCount = lineData.getEntryCount();


        entry = new Entry(xCount, yValues); // 创建一个点
        lineData.addEntry(entry, index); // 将entry添加到指定索引处的折线中

        //通知数据已经改变
        lineData.notifyDataChanged();
        lineChart.notifyDataSetChanged();

        //把yValues移到指定索引的位置
        lineChart.moveViewToAnimated(xCount-2, yValues, YAxis.AxisDependency.LEFT, 500);// TODO: 内存泄漏，异步 待修复
        lineChart.invalidate();
*/
        //最开始的时候才添加 lineDataSet（一个lineDataSet 代表一条线）
        /*if (lineDataSet.getEntryCount() == 0) {
            lineData.addDataSet(lineDataSet);
            lineChart.setData(lineData);
        }*/
        /*
        //避免集合数据过多，及时清空（做这样的处理，并不知道有没有用，但还是这样做了）
        if (timeList.size() > 11) {
            timeList.clear();
        }
*/
        //timeList.add(df.format(System.currentTimeMillis()));

        entry = new Entry(lineDataSet.getEntryCount(), yValues);
        lineData.addEntry(entry, 0);
        //通知数据已经改变
        lineData.notifyDataChanged();
        lineChart.notifyDataSetChanged();
        //设置在曲线图中显示的最大数量
        lineChart.setVisibleXRangeMaximum(777);
        //移到某个位置
        lineChart.moveViewToX(lineData.getEntryCount() - 4);
        //lineChart.invalidate();
    }

    /**
     * 动态添加数据（一条折线图）
     *
     * @param number
     */
    /*
    public void addEntry(int number) {

        //最开始的时候才添加 lineDataSet（一个lineDataSet 代表一条线）
        if (lineDataSet.getEntryCount() == 0) {
            lineData.addDataSet(lineDataSet);
        }
        lineChart.setData(lineData);
        //避免集合数据过多，及时清空（做这样的处理，并不知道有没有用，但还是这样做了）
        if (timeList.size() > 11) {
            timeList.clear();
        }

        timeList.add(df.format(System.currentTimeMillis()));

        Entry entry = new Entry(lineDataSet.getEntryCount(), number);
        lineData.addEntry(entry, 0);
        //通知数据已经改变
        lineData.notifyDataChanged();
        lineChart.notifyDataSetChanged();
        //设置在曲线图中显示的最大数量
        lineChart.setVisibleXRangeMaximum(10);
        //移到某个位置
        lineChart.moveViewToX(lineData.getEntryCount() - 5);
    }
    */

    /**
     * 功能：动态创建一条曲线
     */
    private void createLine(List<Float> dataList, List<Entry> entries, LineDataSet lineDataSet, int color, LineData lineData, LineChart lineChart) {
        for (int i = 0; i < dataList.size(); i++) {
            /**
             * 在此可查看 Entry构造方法，可发现 可传入数值 Entry(float x, float y)
             * 也可传入Drawable， Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示
             */
            Entry entry = new Entry(i, dataList.get(i));// Entry(x,y)
            entries.add(entry);
        }

        lineDataSet.setValueFormatter(new ValueFormatter() {
            @Override
            public String getFormattedValue(float v) {
                return Integer.toString((int)v);//设置自己的返回位数
            }
        });


        //不显示数值标签
        //lineDataSet.setDrawValues(false);


        // 初始化线条
        initLineDataSet(lineDataSet, color, LineDataSet.Mode.CUBIC_BEZIER);//圆滑模式

        if (lineData == null) {
            lineData = new LineData();
            lineData.addDataSet(lineDataSet);
            lineChart.setData(lineData);
        } else {
            lineChart.getLineData().addDataSet(lineDataSet);
        }

        lineChart.invalidate();
    }

    /**
     * 曲线初始化设置,一个LineDataSet 代表一条曲线
     *
     * @param lineDataSet 线条
     * @param color       线条颜色
     * @param mode
     */
    private void initLineDataSet(LineDataSet lineDataSet, int color, LineDataSet.Mode mode) {
        lineDataSet.setColor(color); // 设置曲线颜色
        lineDataSet.setCircleColor(color);  // 设置数据点圆形的颜色
        lineDataSet.setDrawCircleHole(false);// 设置曲线值的圆点是否是空心
        lineDataSet.setLineWidth(1f); // 设置折线宽度
        lineDataSet.setCircleRadius(1f); // 设置折现点圆点半径
        lineDataSet.setValueTextSize(10f);

        lineDataSet.setDrawFilled(false); //设置折线图填充
        lineDataSet.setFormLineWidth(1f);
        lineDataSet.setFormSize(15.f);
        if (mode == null) {
            //设置曲线展示为圆滑曲线（如果不设置则默认折线）
            lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        } else {
            lineDataSet.setMode(mode);
        }

    }

    /**
     * 功能：根据索引显示或隐藏指定线条
     */
    private void showLine(LineChart lineChart,int index) {
        lineChart
                .getLineData()
                .getDataSets()
                .get(index)
                .setVisible(true);
        //.setVisible(mCheckBoxList.get(index).isChecked());
        lineChart.invalidate();
    }
}

